package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户管理
 */
@Controller
@RequestMapping("/system/user")
public class UserController extends BaseController {
    @Autowired
    private UserService userService;
    @Autowired
    private DeptService deptService;
    @Autowired
    private RoleService roleService;

    /**
     * 分页显示
     * 访问路径：http://localhost:8080/system/user/list.do
     * 方法参数：pageNum=1&pageSize=5
     * 方法返回：/WEB-INF/pages/system/user/user-list.jsp
     */
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "5") int pageSize
    ) {
        //获取登录的企业ID（需要改的）
        String companyId = getLoginCompanyId();

        //1.查询数据
        PageInfo pageInfo = userService.findByPage(pageNum, pageSize, companyId);

        //2.存入request
        request.setAttribute("pageInfo", pageInfo);

        return "system/user/user-list";
    }

    /**
     * 进入用户添加页面
     * 访问路径：http://localhost:8080/system/user/toAdd.do
     * 参数：无
     * 返回：/WEB-INF/pages/system/user/user-add.jsp
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        //1.登录企业ID
        String companyId = getLoginCompanyId();

        //2.查询所有部门
        List<Dept> deptList = deptService.findAll(companyId);

        //3.存入request域
        request.setAttribute("deptList", deptList);

        return "system/user/user-add";
    }

    /**
     * 保存用户（添加或修改）
     * 访问路径：http://localhost:8080/system/user/edit.do
     * 参数：User对象
     * 返回：重定向用户列表
     */
    @RequestMapping("/edit")
    public String edit(User user) {
        //获取登录企业信息
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();

        //设置到用户对象中
        user.setCompanyId(companyId);
        user.setCompanyName(companyName);

        //1.判断是否为修改操作
        if (StringUtils.isEmpty(user.getId())) {
            //添加
            userService.save(user);
        } else {
            //修改
            userService.update(user);
        }


        return "redirect:/system/user/list.do";
    }

    /**
     * 进入用户修改页面
     * 路径：http://localhost:8080/system/user/toUpdate.do
     * 参数：id=1
     * 返回：/WEB-INF/pages/system/user/user-update.jsp
     */
    @RequestMapping("toUpdate")
    public String toUpdate(String id) {

        //1.根据id查询用户
        User user = userService.findById(id);

        //2.查询所有部门
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());

        //3.存入request域
        request.setAttribute("user", user);
        request.setAttribute("deptList", deptList);

        return "system/user/user-update";
    }

    /**
     * 用户删除
     * 路径：http://localhost:8080/system/user/delete.do
     * 参数：id=1
     * 返回：json格式
     * {
     * flag:true/false,
     * message:'删除成功'
     * }
     */
    @RequestMapping("/delete")
    @ResponseBody // @ResponseBody该注解可以让方法的返回值转换为Json字符串
    public Map<String, Object> delete(String id) {
        //1.设计返回数据对象
        Map<String, Object> result = new HashMap<>();

        //2.调用业务
        boolean flag = userService.delete(id);
        if (flag) {
            result.put("flag", true);
            result.put("message", "删除成功");
        } else {
            result.put("flag", false);
            result.put("message", "删除失败：该用户已经分配了角色");
        }

        //3.返回结果
        return result;
    }

    /**
     * 进入用户角色设置页面
     * 路径： http://localhost:8080/system/user/roleList.do?
     * 参数：id=002108e2-9a10-4510-9683-8d8fd1d374ef
     * 返回："system/user/user-role"
     */
    @RequestMapping("/roleList")
    public String roleList(String id) {
        //1.查询当前用户对象
        User user = userService.findById(id);
        //2.查询所有角色列表
        List<Role> roleList = roleService.findAll(getLoginCompanyId());
        //3.根据用户ID查询分配过的角色列表
        List<Role> userRoleList = roleService.findUserRoleByUserId(id);

        //4.存入request
        request.setAttribute("user", user);
        request.setAttribute("roleList", roleList);
        request.setAttribute("userRoleList", userRoleList);
        return "system/user/user-role";

    }

    /**
     * 修改用户所拥有的角色
     * 路径： http://localhost:8080/system/user/changeRole.do
     * 参数：userid=""  roleIds="a,b,c..."
     * 返回：
     * <p>
     * roleService.updateRoleModule(roleid, moduleIds);
     */
    @RequestMapping("/changeRole")
    public String changeRole(String userid, String roleIds) {

        userService.changeRole(userid, roleIds);
        return "redirect:/system/user/list.do";
    }

}
